package com.ruoyi.example.service;

import java.util.List;

import com.ruoyi.common.utils.spring.SpringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.example.mapper.ExampleMapper;
import com.ruoyi.example.domain.Example;
import com.ruoyi.common.annotation.CacheZZ;
import com.ruoyi.common.annotation.CacheZZRemove;
import com.ruoyi.common.annotation.CacheZZTable;

/**
 * Service业务层处理
 *
 * @author 众智汇云研发部
 * @date 2021-04-11
 */
@Service
public class ExampleService {

    public final static String example_obj = "example_obj";

    public final static String example_table = "example_table";

    @Autowired
    private ExampleMapper exampleMapper;

    /**
     * 根据ID
     */
    @CacheZZ(hashKey = example_obj, timeOut = 60 * 60 * 24)
    public Example selectExampleById(Long id) {
        return exampleMapper.selectById(id);
    }

    /**
     * 查询
     */
    @CacheZZTable(hashKey = example_table, timeOut = 60 * 60 * 8)
    public List<Example> selectExampleList(Example example) {
        return exampleMapper.selectList(example);
    }

    /**
     * 新增
     *
     * 新增时只需要清除 CacheZZTable 缓存即可
     */
    @CacheZZRemove(CacheZZTable = example_table)
    public int insertExample(Example example) {
        return exampleMapper.insert(example);
    }

    /**
     * 修改
     *
     * 修改时不光要清除 CacheZZTable 缓存，还要清除 CacheZZ注解中 对应的当前id的缓存
     */
    @CacheZZRemove(CacheZZTable = example_table, CacheZZ = example_obj, updateKey = "#example.id")
    public int updateExample(Example example) {
        return exampleMapper.update(example);
    }

    /**
     * 根据id修改姓名
     */
    public int updateNameById(String name,Long id){
        Example exampleParam = new Example();
        exampleParam.setId(id);
        exampleParam.setName(name);
        //一个server中调用另一个方法时，需使用下列方式调用，不然aop失效
        return SpringUtils.getAopProxy(this).updateExample(exampleParam);
    }

    /**
     * 根据名字修改年龄
     *
     * 这种修改方式，不便确认哪一行被修改，为保证数据一致性，清除关于当前server的所有缓存
     */
    @CacheZZRemove(CacheZZTable = {example_table,example_obj})
    public int updateAgeByName(Long age,String name) {
        return exampleMapper.updateAgeByName(age,name);
    }

    /**
     * 批量删除
     *
     * 参数列表如果是id数组，不需要使用 updateKey 指定ID
     */
    @CacheZZRemove(CacheZZTable = example_table, CacheZZ = example_obj)
    public int deleteExampleByIds(Long[] ids) {
        return exampleMapper.deleteByIds(ids);
    }

    /**
     * 单个删除
     *
     * 参数id不是数组则需要使用 updateKey
     */
    @CacheZZRemove(CacheZZTable = example_table, CacheZZ = example_obj, updateKey = "#id")
    public int deleteExampleById(Long id){
        return exampleMapper.deleteById(id);
    }
}
